home *** CD-ROM | disk | FTP | other *** search
/ How to Get Online 1996 Spring / HOW2GON.ISO / mac / Desktop Folder / How To Get Online / SERVERS / CGI / sybase.c < prev   
Encoding:
C/C++ Source or Header  |  1996-03-01  |  5.1 KB  |  1 lines  |  [TEXT/MMCC]

  1. /* * This file forms part of CorVu dbCGI * * CorVu dbCGI is Copyright (C) 1995  CorVu Pty Ltd. * Written by Troy Rollo * * CorVu dbCGI is free software. It may be modified and redistributed under * the terms of the CorVu General Public License, either version 1, or, at * your option, any later version. Ensure that you read this license before * modifying or redistributing the software. * * THIS PROGRAM IS PROVIDED "AS IS" WITH NO WORRANTY OF ANY KIND. YOU USE * THIS PROGRAM ENTIRELY AT YOUR OWN RISK. NEITHER CORVU, NOR ANY OTHER * PARTY MAY BE HELD RESPONSIBLE FOR ANY DAMAGES ARISING FROM YOUR USE OR * MISUSE OF THIS PROGRAM. */#include "dbcgi.h"#include <sybfront.h>#include <sybdb.h>#include <syberror.h>typedef struct __dbw_conninfo{    DBPROCESS    *dbproc;} dbw_conninfo;static dbw_typemap atm[] ={ { SYBCHAR,    0,        NTBSTRINGBIND,    DBWT_Char }, { SYBTEXT,    0,        NTBSTRINGBIND,    DBWT_Char }, { SYBBINARY,    0,        BINARYBIND,    DBWT_Raw_Lidx }, { SYBIMAGE,    0,        BINARYBIND,    DBWT_Raw_Lidx }, { SYBINT1,    0,        INTBIND,    DBWT_Int }, { SYBINT2,    0,        INTBIND,    DBWT_Int }, { SYBINT4,    0,        INTBIND,    DBWT_Int }, { SYBFLT8,    0,        FLT8BIND,    DBWT_Float }, { SYBMONEY,    0,        FLT8BIND,    DBWT_Float }, { SYBBIT,    2,        NTBSTRINGBIND,    DBWT_Char }, { SYBDATETIME,    PRLDATETIME+3,    NTBSTRINGBIND,    DBWT_Char},#ifdef SYBREAL { SYBREAL,    0,        FLT8BIND,    DBWT_Float },#endif#ifdef SYBMONEY4 { SYBMONEY4,    PRMONEY+1,    NTBSTRINGBIND,    DBWT_Float },#endif#ifdef SYBDATETIME4 { SYBDATETIME4,PRLDATETIME+3,    NTBSTRINGBIND,    DBWT_Char},#endif};static    char    *pchCurrentSQL;int    SybHandleError(DBPROCESS *dbproc,            int    iSeverity,            int    iError,            int    iOSErr,            char    *pchError,            char    *pchOSErr){    if (iOSErr != DBNOERR)        FormatErrors(iOSErr, pchOSErr, pchCurrentSQL);    else        FormatErrors(iError, pchError, pchCurrentSQL);    return INT_CANCEL;}int    SybHandleMessage(DBPROCESS *dbproc,            DBINT    iMsgNo,            int    iMsgState,            int    iSeverity,            char    *pchText,            char    *pchServer,            char    *pchProcName,            int    iLine){    if (iSeverity > 1)        FormatErrors(iMsgNo, pchText, pchCurrentSQL);    return 0;}static    void    RunQuery(dbw_value *pval,            int iGetResults){    int    iColumn;    int    nColumns;    char    *pchCommand = GetValue(pval, "Query");    int    iColumnWidth;    int    iColType;    char    achColumnName[256];    dbw_result *prslt;    DBINT    *piIndicators;    dbw_bindinfo *pbi;    dbw_conninfo *pinfo = FindConnection(pval);    char    *pchColName;    pchCurrentSQL = pchCommand;    if (!pinfo ||        !pchCommand ||            dbcmd(pinfo->dbproc, pchCommand) == FAIL)    {        FreeString(pchCommand);        return;    }    if (dbsqlexec(pinfo->dbproc) == FAIL ||        dbresults(pinfo->dbproc) == FAIL)    {        FreeString(pchCommand);        dbfreebuf(pinfo->dbproc);        return;    }    if (!iGetResults)    {        dbcanquery(pinfo->dbproc);        return;    }    nColumns = dbnumcols(pinfo->dbproc);    prslt = new2(dbw_result, nColumns);    piIndicators = new2(DBINT, nColumns);    for (iColumn = 0; iColumn < nColumns; iColumn++)    {        pchColName = dbcolname(pinfo->dbproc, iColumn + 1);        iColType = dbcoltype(pinfo->dbproc, iColumn + 1);        iColumnWidth = dbcollen(pinfo->dbproc, iColumn + 1);        if (pchColName)        {            strncpy(achColumnName,                pchColName,                sizeof(achColumnName) - 1);            achColumnName[sizeof(achColumnName) - 1] = 0;        }        else        {            *achColumnName = 0;        }        pbi = FindColInfo(atm,                rangeof(atm),                &prslt[iColumn],                achColumnName,                iColType,                iColumnWidth,                -1);        dbbind(pinfo->dbproc,            iColumn + 1,            pbi->iBindType,            pbi->iWidth,            pbi->pchData +              (pbi->iBindType == BINARYBIND ? 4 : 0));        dbnullbind(pinfo->dbproc,            iColumn + 1,            piIndicators + iColumn);    }    FormatHeadings(prslt, nColumns);    while (dbnextrow(pinfo->dbproc) != NO_MORE_ROWS)    {        for (iColumn = 0; iColumn < nColumns; iColumn++)        {            prslt[iColumn].iIsNull = (piIndicators[iColumn] == -1);            if (prslt[iColumn].type == DBWT_Raw_Lidx)                *(long *) prslt[iColumn].pchCharValue =                    dbdatlen(pinfo->dbproc, iColumn + 1);        }        FormatOutput(prslt, nColumns);    }    dbcanquery(pinfo->dbproc);}voidDBQuery(dbw_value *pval){    RunQuery(pval, 1);}voidDBExecute(dbw_value *pval){    RunQuery(pval, 0);}voidDBDisconnect(dbw_value *pval){    dbw_conninfo *pinfo = FindConnection(pval);    pchCurrentSQL = "Disconnect";    if (!pinfo)        return;    dbcancel(pinfo->dbproc);    dbclose(pinfo->dbproc);    DropConnection(pval);}voidDBInit(dbw_value *pval){    char        *pchSybase = GetValue(pval, "SYBASE");    pchCurrentSQL = "Init";    PutEnvVar("SYBASE", pchSybase);    FreeString(pchSybase);    dberrhandle((int (*)()) SybHandleError);        dbmsghandle((int (*)()) SybHandleMessage);}voidDBUnInit(dbw_value *pval){    pchCurrentSQL = "UnInit";    dbexit();}voidDBConnect(dbw_value *pval){    char        *pchUser = GetValue(pval, "USER");    char        *pchPass = GetValue(pval, "PASS");    char        *pchServer = GetValue(pval, "SERVER");    char        *pchAppName = GetValue(pval, "APPNAME");    dbw_conninfo    *pinfo = new(dbw_conninfo);    LOGINREC    *plr;    pchCurrentSQL = "Connect";    if (!AddConnection(pval, pinfo))    {        free(pinfo);        return;    }    plr = dblogin();    if (!plr)    {        DropConnection(pval);        return;    }    DBSETLUSER(plr, pchUser);    DBSETLPWD(plr, pchPass);    DBSETLAPP(plr, pchAppName ? pchAppName : "sybdbcgi");    pinfo->dbproc = dbopen(plr, pchServer);    dbloginfree(plr);    if (!pinfo->dbproc)    {        DropConnection(pval);        return;    }    FreeString(pchAppName);    FreeString(pchServer);    FreeString(pchUser);    FreeString(pchPass);}